package com.jsbs.iam.user.service;

import com.jsbs.iam.user.dto.OrgInfoAddDto;
import com.jsbs.iam.user.dto.OrgInfoDeleteDto;
import com.jsbs.iam.user.dto.OrgInfoQueryDto;
import com.jsbs.iam.user.entity.IamOrgTypeExtendedField;
import com.jsbs.iam.user.param.OrgInfoParam;
import com.jsbs.iam.user.vo.OrgInfoTypeVo;
import com.jsbs.iam.user.vo.OrgInfoVo;
import com.jsbs.iam.user.vo.OrgThreeInfo;

import java.util.List;

public interface OrgInfoService {

    /**
     * 功能描述：同步处理组织架构数据
     * @param orgInfoParam
     */
    void syncOrgInfo(OrgInfoParam orgInfoParam);

    /**
     * 获取组织树
     * @param orgInfoQueryDto
     * @return
     */
    List<OrgThreeInfo> selectOrgTypeInfo(OrgInfoQueryDto orgInfoQueryDto);

    /**
     * 获取组织类型扩展字段数据
     *
     * @param companyCode
     * @param orgTypeCode
     * @return
     */
    List<IamOrgTypeExtendedField> getOrgTypeExtend(String orgTypeCode, String companyCode);

    /**
     * 新增组织层级
     * @param orgInfoAddDto
     */
    void addOrgInfo(OrgInfoAddDto orgInfoAddDto);

    /**
     * 删除组织层级
     *
     * @param deleteDto
     */
    void deleteOrgInfo(OrgInfoDeleteDto deleteDto);

    /**
     * 根据组织编码查询组织数据
     *
     * @param orgInfoAddDto
     * @return
     */
    OrgInfoVo selectOrgInfo(OrgInfoAddDto orgInfoAddDto);

    /**
     * 根据组织编码修改组织数据
     * @param orgInfoAddDto
     */
    void updateOrgInfo(OrgInfoAddDto orgInfoAddDto);

    /**
     * 组织移动
     * @param orgInfoAddDto
     */
    void moveOrg(OrgInfoAddDto orgInfoAddDto);

    /**
     * 根据组织编码获取对应层级
     *
     * @param orgCode
     * @param companyCode
     * @return
     */
    int verifyLevel(String orgCode, String companyCode);

    /**
     * 查询组织下用户数量
     *
     * @param orgTypeCode
     * @param orgCode
     * @param companyCode
     * @return
     */
    int getUserCount(String orgTypeCode, String orgCode, String companyCode);

    /**
     * 功能描述：根据组织类型+组织编码查询组织数据
     * @param orgcodeList
     * @param orgTypeCode
     * @return
     */
    List<OrgInfoTypeVo> queryByCode(List<String> orgcodeList, String orgTypeCode);

    /**
     * 获取所有组织树数据
     * @param companyCode
     * @return
     */
    List<OrgThreeInfo> getOrgThreeAllInfo(String companyCode);

    /**
     * 查询对应字段详细数据
     * @param fieldId
     * @param companyCode
     * @return
     */
    IamOrgTypeExtendedField getExtendInfo(String fieldId, String companyCode);

    /**
     * 校验扩展字段唯一性
     * @param fieldId
     * @param fieldData
     * @param companyCode
     * @return
     */
    int verifyIsSole(String fieldId, String fieldData, String companyCode);

    /**
     * 获取指定扩展字段数据
     * @param fieldId
     * @param orgCode
     * @param companyCode
     * @return
     */
    String verifyFieldData(String fieldId, String orgCode, String companyCode);

    /**
     * 普管获取组织树信息
     * @param orgInfoQueryDto
     * @return
     */
    List<OrgThreeInfo> selectOrgTypeInfoRestrict(OrgInfoQueryDto orgInfoQueryDto);
}
